{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapter 3: Linear Regression for a housing dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Importing the necessary packages"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "import numpy as np\n",
    "import random\n",
    "import utils"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Defining and plotting our dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 2 3 5 6 7]\n",
      "[155 197 244 356 407 448]\n"
     ]
    }
   ],
   "source": [
    "features = np.array([1,2,3,5,6,7])\n",
    "labels = np.array([155, 197, 244, 356,407,448])\n",
    "\n",
    "print(features)\n",
    "print(labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "utils.plot_points(features, labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Coding the tricks\n",
    "\n",
    "- Simple trick\n",
    "- Absolute trick\n",
    "- Square trick"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def simple_trick(base_price, price_per_room, num_rooms, price):\n",
    "    small_random_1 = random.random()*0.1\n",
    "    small_random_2 = random.random()*0.1\n",
    "    predicted_price = base_price + price_per_room*num_rooms\n",
    "    if price > predicted_price and num_rooms > 0:\n",
    "        price_per_room += small_random_1\n",
    "        base_price += small_random_2\n",
    "    if price > predicted_price and num_rooms < 0:\n",
    "        price_per_room -= small_random_1\n",
    "        base_price += small_random_2\n",
    "    if price < predicted_price and num_rooms > 0:\n",
    "        price_per_room -= small_random_1\n",
    "        base_price -= small_random_2\n",
    "    if price < predicted_price and num_rooms < 0:\n",
    "        price_per_room -= small_random_1\n",
    "        base_price += small_random_2\n",
    "    return price_per_room, base_price"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def absolute_trick(base_price, price_per_room, num_rooms, price, learning_rate):\n",
    "    predicted_price = base_price + price_per_room*num_rooms\n",
    "    if price > predicted_price:\n",
    "        price_per_room += learning_rate*num_rooms\n",
    "        base_price += learning_rate\n",
    "    else:\n",
    "        price_per_room -= learning_rate*num_rooms\n",
    "        base_price -= learning_rate\n",
    "    return price_per_room, base_price"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def square_trick(base_price, price_per_room, num_rooms, price, learning_rate):\n",
    "    predicted_price = base_price + price_per_room*num_rooms\n",
    "    price_per_room += learning_rate*num_rooms*(price-predicted_price)\n",
    "    base_price += learning_rate*(price-predicted_price)\n",
    "    return price_per_room, base_price"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Running the linear regression algorithm\n",
    "\n",
    "The linear regression algorithm consists of:\n",
    "- Starting with random weights\n",
    "- Iterating the square (or simple, or absolute) trick many times."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Price per room: 51.04430678220095\n",
      "Base price: 91.59448307644864\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(51.04430678220095, 91.59448307644864)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "# We set the random seed in order to always get the same results.\n",
    "random.seed(0)\n",
    "\n",
    "def linear_regression(features, labels, learning_rate=0.01, epochs = 1000):\n",
    "    price_per_room = random.random()\n",
    "    base_price = random.random()\n",
    "    for epoch in range(epochs):\n",
    "        # Uncomment any of the following lines to plot different epochs\n",
    "        #if epoch == 1:\n",
    "        #if epoch <= 10:\n",
    "        #if epoch <= 50:\n",
    "        #if epoch > 50:\n",
    "        if True:\n",
    "            utils.draw_line(price_per_room, base_price, starting=0, ending=8)\n",
    "        i = random.randint(0, len(features)-1)\n",
    "        num_rooms = features[i]\n",
    "        price = labels[i]\n",
    "        # Uncomment any of the 2 following lines to use a different trick\n",
    "        #price_per_room, base_price = absolute_trick(base_price,\n",
    "        price_per_room, base_price = square_trick(base_price,\n",
    "                                                  price_per_room,\n",
    "                                                  num_rooms,\n",
    "                                                  price,\n",
    "                                                  learning_rate=learning_rate)\n",
    "    utils.draw_line(price_per_room, base_price, 'black', starting=0, ending=8)\n",
    "    utils.plot_points(features, labels)\n",
    "    print('Price per room:', price_per_room)\n",
    "    print('Base price:', base_price)\n",
    "    return price_per_room, base_price\n",
    "\n",
    "# This line is for the x-axis to appear in the figure\n",
    "plt.ylim(0,500)\n",
    "\n",
    "linear_regression(features, labels, learning_rate = 0.01, epochs = 1000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Root mean squared error function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# The root mean square error function\n",
    "def rmse(labels, predictions):\n",
    "    n = len(labels)\n",
    "    differences = np.subtract(labels, predictions)\n",
    "    return np.sqrt(1.0/n * (np.dot(differences, differences)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plotting the error function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Price per room: 50.65781332767556\n",
      "Base price: 99.79504258184782\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(50.65781332767556, 99.79504258184782)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def linear_regression(features, labels, learning_rate=0.01, epochs = 1000):\n",
    "    price_per_room = random.random()\n",
    "    base_price = random.random()\n",
    "    errors = []\n",
    "    for i in range(epochs):\n",
    "        predictions = features[0]*price_per_room+base_price\n",
    "        errors.append(rmse(labels, predictions))\n",
    "        i = random.randint(0, len(features)-1)\n",
    "        num_rooms = features[i]\n",
    "        price = labels[i]\n",
    "        # Uncomment one of the following 3 lines to use the simple, the absolute, or the square trick\n",
    "        #price_per_room, base_price = simple_trick(base_price,\n",
    "        #price_per_room, base_price = absolute_trick(base_price,\n",
    "        price_per_room, base_price = square_trick(base_price,\n",
    "                                                  price_per_room,\n",
    "                                                  num_rooms,\n",
    "                                                  price,\n",
    "                                                  learning_rate=learning_rate)\n",
    "    utils.draw_line(price_per_room, base_price, 'black', starting=0, ending=9)\n",
    "    utils.plot_points(features, labels)\n",
    "    print('Price per room:', price_per_room)\n",
    "    print('Base price:', base_price)\n",
    "    plt.show()\n",
    "    plt.scatter(range(len(errors)), errors)\n",
    "    plt.show()\n",
    "    return price_per_room, base_price\n",
    "\n",
    "linear_regression(features, labels, learning_rate = 0.01, epochs = 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Linear regression in Turi Create"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\"><table frame=\"box\" rules=\"cols\">\n",
       "    <tr>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">features</th>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">labels</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">155</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">2</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">197</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">3</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">244</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">5</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">356</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">6</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">407</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">7</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">448</td>\n",
       "    </tr>\n",
       "</table>\n",
       "[6 rows x 2 columns]<br/>\n",
       "</div>"
      ],
      "text/plain": [
       "Columns:\n",
       "\tfeatures\tint\n",
       "\tlabels\tint\n",
       "\n",
       "Rows: 6\n",
       "\n",
       "Data:\n",
       "+----------+--------+\n",
       "| features | labels |\n",
       "+----------+--------+\n",
       "|    1     |  155   |\n",
       "|    2     |  197   |\n",
       "|    3     |  244   |\n",
       "|    5     |  356   |\n",
       "|    6     |  407   |\n",
       "|    7     |  448   |\n",
       "+----------+--------+\n",
       "[6 rows x 2 columns]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import turicreate as tc\n",
    "\n",
    "datadict = {\n",
    "    'features': features,\n",
    "    'labels'  : labels,\n",
    "}\n",
    "\n",
    "data = tc.SFrame(datadict)\n",
    "\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre>Linear regression:</pre>"
      ],
      "text/plain": [
       "Linear regression:"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>--------------------------------------------------------</pre>"
      ],
      "text/plain": [
       "--------------------------------------------------------"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Number of examples          : 6</pre>"
      ],
      "text/plain": [
       "Number of examples          : 6"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Number of features          : 1</pre>"
      ],
      "text/plain": [
       "Number of features          : 1"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Number of unpacked features : 1</pre>"
      ],
      "text/plain": [
       "Number of unpacked features : 1"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Number of coefficients    : 2</pre>"
      ],
      "text/plain": [
       "Number of coefficients    : 2"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Starting Newton Method</pre>"
      ],
      "text/plain": [
       "Starting Newton Method"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>--------------------------------------------------------</pre>"
      ],
      "text/plain": [
       "--------------------------------------------------------"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>+-----------+----------+--------------+--------------------+---------------------------------+</pre>"
      ],
      "text/plain": [
       "+-----------+----------+--------------+--------------------+---------------------------------+"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>| Iteration | Passes   | Elapsed Time | Training Max Error | Training Root-Mean-Square Error |</pre>"
      ],
      "text/plain": [
       "| Iteration | Passes   | Elapsed Time | Training Max Error | Training Root-Mean-Square Error |"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>+-----------+----------+--------------+--------------------+---------------------------------+</pre>"
      ],
      "text/plain": [
       "+-----------+----------+--------------+--------------------+---------------------------------+"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>| 1         | 2        | 1.005172     | 7.159578           | 5.011301                        |</pre>"
      ],
      "text/plain": [
       "| 1         | 2        | 1.005172     | 7.159578           | 5.011301                        |"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>+-----------+----------+--------------+--------------------+---------------------------------+</pre>"
      ],
      "text/plain": [
       "+-----------+----------+--------------+--------------------+---------------------------------+"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = tc.linear_regression.create(data, target='labels')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre>SUCCESS: Optimal solution found.</pre>"
      ],
      "text/plain": [
       "SUCCESS: Optimal solution found."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre></pre>"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\"><table frame=\"box\" rules=\"cols\">\n",
       "    <tr>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">name</th>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">index</th>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">value</th>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">stderr</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">(intercept)</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">None</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">101.13831392475674</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">5.272933357982522</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">features</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">None</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">50.007088185477485</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1.1598906969719902</td>\n",
       "    </tr>\n",
       "</table>\n",
       "[2 rows x 4 columns]<br/>\n",
       "</div>"
      ],
      "text/plain": [
       "Columns:\n",
       "\tname\tstr\n",
       "\tindex\tstr\n",
       "\tvalue\tfloat\n",
       "\tstderr\tfloat\n",
       "\n",
       "Rows: 2\n",
       "\n",
       "Data:\n",
       "+-------------+-------+--------------------+--------------------+\n",
       "|     name    | index |       value        |       stderr       |\n",
       "+-------------+-------+--------------------+--------------------+\n",
       "| (intercept) |  None | 101.13831392475674 | 5.272933357982522  |\n",
       "|   features  |  None | 50.007088185477485 | 1.1598906969719902 |\n",
       "+-------------+-------+--------------------+--------------------+\n",
       "[2 rows x 4 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.coefficients"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype: float\n",
       "Rows: 1\n",
       "[301.1666666666667]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "new_point = tc.SFrame({'features': [4]})\n",
    "\n",
    "model.predict(new_point)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
